<?php

use Illuminate\Database\Seeder;

class CoursesTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //1
        $html = <<<EOF
<h2 id="什么是_HTML">什么是 HTML?</h2>

<p><a class="glossaryLink" href="/en-US/docs/Glossary/HTML" title="HTML: HTML (HyperText Markup Language) is a descriptive language that specifies webpage structure.">HTML</a> (HyperText Markup Language) 不是一门编程语言，而是一种用来告知浏览器如何组织页面的<strong>标记语言</strong>。HTML 可复杂、可简单，一切取决于开发者。它由一系列的<strong>元素（<a class="glossaryLink" href="/en-US/docs/Glossary/Element" title="elements: An element is a part of a webpage. In XML and HTML, an element may contain a data item or a chunk of text or an image, or perhaps nothing. A typical element includes an opening tag with some attributes, enclosed text content, and a closing tag.
 ">elements</a>）</strong>组成，这些元素可以用来包围不同部分的内容，使其以某种方式呈现或者工作。 一对标签（ <a class="glossaryLink" href="/en-US/docs/Glossary/Tag" title="tags: In HTML a tag is used for creating an element.  The name of an HTML element is the name used in angle brackets such as &lt;p> for paragraph.  Note that the end tag''s name is preceded by a slash character, &quot;&lt;/p>&quot;, and that in empty elements the end tag is neither required nor allowed. If attributes are not mentioned, default values are used in each case.">tags</a>）可以为一段文字或者一张图片添加超链接，将文字设置为斜体，改变字号，等等。 例如下面一行内容：</p>

<pre>我的猫咪脾气爆:)</pre>

<p>可以将这行文字封装成一个段落（Paragraph）<a href="/zh-CN/docs/Web/HTML/Element/p" title="HTML &lt;p>元素（或者说 HTML 段落元素）表示文本的一个段落。该元素通常表现为一整块与相邻文本分离的文本，或以垂直的空白隔离或以首行缩进。另外，&lt;p> 是块级元素。"><code>&lt;p&gt;</code></a>元素来使其在单独一行呈现：</p>

<pre class="brush: html">&lt;p&gt;我的猫咪脾气爆:)&lt;/p&gt;</pre>

<div class="note">
<p><strong>注：</strong>HTML 标签不区分大小写。也就是说，输入标签时既可以使用大写字母也可以使用小写字母。例如，标签 <a href="/zh-CN/docs/Web/HTML/Element/title" title="HTML &lt;title> 元素 定义文档的标题，显示在浏览器的标题栏或标签页上。它只可以包含文本，若是包含有标签，则包含的任何标签都不会被解释。"><code>&lt;title&gt;</code></a> 写作<code>&lt;title&gt;<font face="x-locale-heading-primary, zillaslab, Palatino, Palatino Linotype, x-locale-heading-secondary, serif"><span style="background-color: #fff3d4;">、</span></font></code><code>&lt;TITLE&gt;</code>、<code>&lt;Title&gt;</code>、<code>&lt;TiTlE&gt;</code>，等等都可以正常工作。不过，从一致性、可读性等各方面来说，最好仅使用小写字母。</p>
</div>

<h2 id="剖析一个_HTML_元素">剖析一个 HTML 元素</h2>

<p>让我们进一步探讨我们的段落元素：</p>

<p><img alt="" src="https://mdn.mozillademos.org/files/16475/element.png" style="display: block; height: 255px; margin: 0px auto; width: 821px;"></p>

<p>这个元素的主要部分有：</p>

<ol>
 <li><strong>开始标签</strong>（Opening tag）：包含元素的名称（本例为 p），被左、右角括号所包围。表示元素从这里开始或者开始起作用 —— 在本例中即段落由此开始。</li>
 <li><strong>结束标签</strong>（Closing tag）：与开始标签相似，只是其在元素名之前包含了一个斜杠。这表示着元素的结尾 —— 在本例中即段落在此结束。初学者常常会犯忘记包含结束标签的错误，这可能会产生一些奇怪的结果。</li>
 <li><strong>内容</strong>（Content）：元素的内容，本例中就是所输入的文本本身。</li>
 <li><strong>元素</strong>（Element）：开始标签、结束标签与内容相结合，便是一个完整的元素。</li>
</ol>

<h3 id="主动学习：创建第一个_HTML_元素">主动学习：创建第一个 HTML 元素</h3>

<p>通过使用标签<code>&lt;em&gt;</code>和<code>&lt;/em&gt;</code>（在前面放置<code>&lt;em&gt;</code>打开元素，在后面放置<code>&lt;/em&gt;</code>关闭元素）——这使得行内容变成斜体强调！你可以在“输出”区域中实时查看更改更新。</p>
EOF;
        $course = new \App\Models\Course();
        $course->title = 'HTML基础';
        $course->description = '本节详细介绍HTML的标签等知识点';
        $course->content = $html;
        $course->exp = 10;
        $course->depth = 5;
        $course->save();


        $his = <<<EOF
<p>超文本标记语言（第一版）——在1993年6月作为互联网工程工作小组（IETF）工作草案发布（并非标准）：</p><p>HTML 2.0——1995年11月作为RFC 1866发布，在RFC 2854于2000年6月发布之后被宣布已经过时</p><p>HTML 3.2——1997年1月14日，W3C推荐标准</p><p>HTML 4.0——1997年12月18日，W3C推荐标准</p><p>HTML 4.01（微小改进）——1999年12月24日，W3C推荐标准</p><p>HTML 5——2014年10月28日，W3C推荐标准[4]</p><p>ISO/IEC 15445:2000（“ISO HTML”）——2000年5月15日发布，基于严格的HTML 4.01语法，是国际标准化组织和国际电工委员会的标准。</p><p>Wijmo是基于HTML5、jQuery、CSS3和SVG的一个控件包，能够满足构建当今Web系统的需求。基于Wijmo，您的系统运行将更加快速和流畅，外观也会更加引人入胜。Wijmo中所有新的控件都是在符合最新的UI设计潮流的基础上，对新的以及改良后的主题进行封装。优美的、专业的控件外观会让您的应用程序引人注目。比如 ComponentOne Studio for ASP .NET Wijmo 控件包内置的6个主题，同时可以使用jQuery UI项目提供的 30 多个主题，甚至可以使用 ThemeRoller 创建属于您自己的系统主题。</p><p>HTML没有1.0版本是因为当时有很多不同的版本。有些人认为蒂姆·伯纳斯-李的版本应该算初版，这个版本没有IMG元素。当时被称为HTML+的后续版的开发工作于1993年开始，最初是被设计成为“HTML的一个超集”。第一个正式规范为了和当时的各种HTML标准区分开来，使用了2.0作为其版本号。HTML+的发展继续下去，但是它从未成为标准。</p><p>HTML3.0规范是由当时刚成立的W3C于1995年3月提出，提供了很多新的特性，例如表格、文字绕排和复杂数学元素的显示。虽然它是被设计用来兼容2.0版本的，但是实现这个标准的工作在当时过于复杂，在草案于1995年9月过期时，标准开发也因为缺乏浏览器支持而中止了。3.1版从未被正式提出，而下一个被提出的版本是开发代号为Wilbur的HTML 3.2，去掉了大部分3.0中的新特性，但是加入了很多特定浏览器，例如Netscape和Mosaic的元素和属性。HTML对数学公式的支持最后成为另外一个标准MathML。</p><p>HTML 4.0同样也加入了很多特定浏览器的元素和属性，但是同时也开始“清理”这个标准，把一些元素和属性标记为过时，建议不再使用它们。HTML的未来和CSS结合会更好。</p><p>HTML 5草案的前身名为Web Applications 1.0。于2004年被WHATWG提出，于2007年被W3C接纳，并成立了新的HTML工作团队。在2008年1月22日，第一份正式草案发布。</p><p>XHTML1.0——发布于2000年1月26日，是W3C推荐标准，后来经过修订于2002年8月1日重新发布。</p><p>XHTML 1.1，于2001年5月31日发布，W3C推荐标准。</p><p>XHTML 2.0，W3C工作草案。</p><p>HTML 5草案。</p><p>HTML4.01 是常见的版本。</p>
EOF;

        //支线 HTML 历史
        $course = new \App\Models\Course();
        $course->title = 'HTML发展历程';
        $course->description = '本节详细介绍HTML的标签等知识点';
        $course->content = $his;
        $course->course_type = \App\Models\Course::COURSE_TYPE_MINOR;
        $course->exp = 20;
        $course->depth = 10;
        $course->save();



        //实践任务 个人简历制作

        $course = new \App\Models\Course();
        $course->title = '个人简历制作';
        $course->description = '本节详细介绍HTML的标签等知识点';
        $course->content = '充分利用已学习的HTML标签知识，完成一份个人简历。';
        $course->course_type = \App\Models\Course::COURSE_TYPE_PRACTISE;
        $course->exp = 30;
        $course->depth = 10;
        $course->save();



//        \Illuminate\Support\Facades\DB::insert('INSERT INTO tree.skill_course (skill_id, course_id, next_course_id, complete_percentage, step) VALUES (1, 1, \'[]\', 20.00, 1);');

        $md = <<<EOF
<div><p data-source-line="1">正则表达式（regular expression）的运用十分广泛，例如在表单中的校验电子邮箱是否正确，密码是否符合要求等。</p><p data-source-line="3">首先给大家推荐一个正则表达式测试网站：<a href="http://regexr.com/" target="_blank">RegExr</a></p><h1 id="匹配字符" data-source-line="5"><a class="markdownIt-Anchor" href="#匹配字符"></a>匹配字符</h1><p data-source-line="7">文本：</p><blockquote data-source-line="9"><p>hello world</p></blockquote><p data-source-line="11">正则表达式：</p><pre data-source-line="13"><code class="hljs"><span class="hljs-attribute">l</span>
</code></pre><p data-source-line="17">结果：</p><p data-source-line="19">he<mark>l</mark><mark>l</mark>o wor<mark>l</mark>d</p><p data-source-line="21">分析：该正则表达式匹配了文本中所有含有<code>l</code>的字符。</p><p data-source-line="23">再如：如果正则表达式为<code>hello</code>，那么结果会是“<mark>hello</mark> world”</p><p data-source-line="25"><em>试试看</em></p><ol start="0" data-source-line="27"><li>试一试正则表达式<code>ll</code>在“hello world”中匹配到的字符</li></ol><h1 id="匹配字符集" data-source-line="29"><a class="markdownIt-Anchor" href="#匹配字符集"></a>匹配字符集</h1><p data-source-line="31">字符集的开始用 <code>[</code>，结束用<code>]</code>，中间表示范围，下面通过几个例子来展示字符集的语法。</p><h2 id="abc" data-source-line="34"><a class="markdownIt-Anchor" href="#abc"></a>[abc]</h2><p data-source-line="36">该正则表达式匹配文本中的<code>a</code>或<code>b</code>或<code>c</code></p><p data-source-line="38">文本：</p><blockquote data-source-line="40"><p>A quick brown fox jump over the lazy dog.</p></blockquote><p data-source-line="42">正则表达式：</p><pre data-source-line="44"><code class="hljs">[abc]
</code></pre><p data-source-line="48">结果：</p><p data-source-line="50">A qui<mark>c</mark>k <mark>b</mark>rown fox jump over the l<mark>a</mark>zy dog.</p><h2 id="a-z" data-source-line="52"><a class="markdownIt-Anchor" href="#a-z"></a>[a-z]</h2><p data-source-line="54">该正则表达式匹配一个小写英文字母。（也就是说，默认情况下正则表达式是区分大小写的）</p><h2 id="a-za-z" data-source-line="56"><a class="markdownIt-Anchor" href="#a-za-z"></a>[a-zA-Z]</h2><p data-source-line="58">该正则表达式匹配一个英文字母。</p><h2 id="a-za-z0-9" data-source-line="60"><a class="markdownIt-Anchor" href="#a-za-z0-9"></a>[a-zA-Z0-9]</h2><p data-source-line="62">该正则表达式匹配一个英文字母或0-9之间的阿拉伯数字。</p><h2 id="xyz" data-source-line="64"><a class="markdownIt-Anchor" href="#xyz"></a>[^xyz]</h2><p data-source-line="66">反向字符集，相当于“非”。该正则表达式匹配文本中<strong>不</strong>含有<code>x</code>或<code>y</code>或<code>z</code>的字符。</p><p data-source-line="68">注意，该正则表达式不等同于<code>^[xyz]</code>。</p><p data-source-line="70"><em>试试看</em></p><ol data-source-line="72"><li>尝试用两种不同的方式匹配一个奇数，该数字取值范围为1-9。</li><li>匹配一个二位数。（提示：可以连用[][]）</li></ol><h2 id="特殊字符元字符" data-source-line="75"><a class="markdownIt-Anchor" href="#特殊字符元字符"></a>特殊字符（元字符）</h2><table data-source-line="78"><thead><tr><th>特殊字符</th><th>说明</th><th>等价形式</th></tr></thead><tbody><tr><td>\d</td><td>匹配一个数字</td><td>[0-9]</td></tr><tr><td>\D</td><td>匹配一个非数字字符</td><td>[^0-9]</td></tr><tr><td>\n</td><td>匹配一个换行符</td><td></td></tr><tr><td>\r</td><td>匹配一个回车符</td><td></td></tr><tr><td>\s</td><td>匹配一个空白字符，包括空格、制表符、换页符和换行符</td><td></td></tr><tr><td>\S</td><td>匹配一个非空白字符</td><td></td></tr><tr><td>\t</td><td>匹配一个水平制表符</td><td></td></tr><tr><td>\w</td><td>匹配一个单字字符（字母、数字或者下划线）</td><td>[A-Za-z0-9_]</td></tr><tr><td>\W</td><td>匹配一个非单字字符</td><td>[^A-Za-z0-9_]</td></tr><tr><td>.</td><td>匹配除换行符之外的任何单个字符</td><td></td></tr></tbody></table><h1 id="量词" data-source-line="91"><a class="markdownIt-Anchor" href="#量词"></a>量词</h1><p data-source-line="93">在看这一部分之前，如果我们想要匹配6位的数字，那么我们可以这样写</p><pre data-source-line="95"><code class="hljs"><span class="hljs-symbol">\d</span><span class="hljs-symbol">\d</span><span class="hljs-symbol">\d</span><span class="hljs-symbol">\d</span><span class="hljs-symbol">\d</span><span class="hljs-symbol">\d</span>
</code></pre><p data-source-line="99">可以发现这个正则表达式非常长，如果是匹配一百位数字，那么写起来实在是太痛苦了。其实我们可以使用<code>\d{6}</code>，它等价于<code>\d\d\d\d\d\d</code>。</p><p data-source-line="101"><code>{n}</code>表示前面一个字符刚好发生了n次。（n是正整数）</p><p data-source-line="103">另外，还有<code>{n,m}</code>匹配前面的字符至少n次，最多m次。</p><p data-source-line="105"><em>试试看</em></p><ol start="3" data-source-line="107"><li>尝试匹配手机号码。手机号码的长度是12位，第一位必为1，第二位可能是3或5或7或8或9，第三位之后为任意数字。</li><li>试说明<code>6{3,}</code>的意义</li></ol><p data-source-line="110">除此之外还有一些量词用于简化表达式：</p><table data-source-line="112"><thead><tr><th>量词</th><th>说明</th><th>等价形式</th></tr></thead><tbody><tr><td>*</td><td>匹配前一个表达式0次或多次</td><td>{0,}</td></tr><tr><td>+</td><td>匹配前面一个表达式1次或者多次</td><td>{1,}</td></tr><tr><td>?</td><td>匹配前面一个表达式0次或者1次</td><td>{0,1}</td></tr></tbody></table><p data-source-line="118"><code>?</code>如果紧跟在任何量词 *、 +、? 或 {} 的后面，将会使量词变为非贪婪的（匹配尽量少的字符），和缺省使用的贪婪模式（匹配尽可能多的字符）正好相反。</p><p data-source-line="120">下面给出一个例子来说明贪婪模式和非贪婪模式。</p><p data-source-line="122">文本：</p><blockquote data-source-line="124"><p><code>&lt;a href="#" class="example"&gt;test&lt;/a&gt;</code></p></blockquote><p data-source-line="126">正则表达式：</p><pre data-source-line="128"><code class="hljs"><span class="hljs-attr">href</span>=<span class="hljs-string">".*"</span>
</code></pre><p data-source-line="132">匹配到的内容：</p><pre data-source-line="133"><code class="hljs">href=<span class="hljs-string">"#"</span> <span class="hljs-keyword">class</span>=<span class="hljs-string">"example"</span>
</code></pre><p data-source-line="137">正则表达式：</p><pre data-source-line="139"><code class="hljs"><span class="hljs-attr">href</span>=<span class="hljs-string">".*?"</span>
</code></pre><p data-source-line="143">匹配到的内容：</p><pre data-source-line="144"><code class="hljs"><span class="hljs-attr">href</span>=<span class="hljs-string">"#"</span>
</code></pre><h1 id="开始与结束" data-source-line="148"><a class="markdownIt-Anchor" href="#开始与结束"></a>开始与结束</h1><p data-source-line="150">如果我们想要写一个正则表达式校验QQ号是否正确，我们应该考虑这个QQ号应该在5-11位之间，而且用户输入时只能是数字，那么我们应该这么写：</p><pre data-source-line="152"><code class="hljs">^\d{<span class="hljs-number">5</span>,<span class="hljs-number">11</span>}$
</code></pre><p data-source-line="156">其中，^匹配输入的开始，\$匹配字符串的结束</p><p data-source-line="158"><em>试试看</em></p><ol start="5" data-source-line="160"><li>上面的例子有个漏洞，你能发现吗？</li></ol><h1 id="选择" data-source-line="162"><a class="markdownIt-Anchor" href="#选择"></a>选择</h1><p data-source-line="164">如果我们想要写一个正则表达式校验身份证号码是否正确，我们应该考虑这个身份证号码号应该是15位或18位。那么一个简单的例子如下：</p><pre data-source-line="166"><code class="hljs">^<span class="hljs-tag">\<span class="hljs-name">d</span><span class="hljs-string">{15}</span></span>|<span class="hljs-tag">\<span class="hljs-name">d</span><span class="hljs-string">{18}</span></span><span class="hljs-formula">$
</span></code></pre><p data-source-line="170">完整的校验还应该考虑到出生日期是否在合理范围内，以及身份证号中含有X等情况。</p><h1 id="子表达式与捕获" data-source-line="172"><a class="markdownIt-Anchor" href="#子表达式与捕获"></a>子表达式与捕获</h1><h2 id="子表达式" data-source-line="174"><a class="markdownIt-Anchor" href="#子表达式"></a>子表达式</h2><p data-source-line="176">给定一组文件名，例如<code>a.jpg</code>需要匹配路径中的文件名部分为图片格式的文件名。已知图片格式包含jpg或jpeg或png或gif。</p><p data-source-line="178">分析：根据上文提到的选择，我们应该知道正则表达式中应该含有<code>jpg|jpeg|png|gif</code>，可是只有这段正则表达式并不能匹配到文件名部分，这时候需要使用子表达式。</p><p data-source-line="180">文本：</p><blockquote data-source-line="182"><p>a.jpg</p><p>b.png</p><p>c.txt</p><p>d.avi</p></blockquote><p data-source-line="190">正则表达式：</p><pre data-source-line="192"><code class="hljs">.*?\.(jpg|<span class="hljs-type">jpeg</span>|<span class="hljs-type">png</span>|<span class="hljs-type">gif</span>)
</code></pre><p data-source-line="196">结果：</p><p data-source-line="198"><mark>a.jpg</mark></p><p data-source-line="200"><mark>b.png</mark></p><p data-source-line="202">c.txt</p><p data-source-line="204">d.avi</p><p data-source-line="206">分析：</p><p data-source-line="208"><code>.*?</code>是非贪婪模式下选择任意字符。也就是匹配文件名部分。</p><p data-source-line="210"><code>\.</code>是匹配到文件后缀名前的<code>.</code>。但是正则表达式中的<code>.</code>表示任意字符，为了能查找到<code>.</code>本身，需要在前面添加反斜杠<code>\</code>。这种方式称为“转义”，将在下文中提到。</p><p data-source-line="212"><code>(jpg|jpeg|png|gif)</code>表示这个子表达式中符合字符串中含有jpg或jpeg或png或gif的部分。</p><h2 id="捕获" data-source-line="214"><a class="markdownIt-Anchor" href="#捕获"></a>捕获</h2><p data-source-line="216">捕获在字符串替换中大有用处。<code>(x)</code>匹配 'x' 并且记住匹配项，括号被称为<em>捕获括号</em>。</p><p data-source-line="218">在匹配环节，可以在捕获后使用<code>\1</code>、<code>\2</code>……替代之前捕获的结果。</p><p data-source-line="220">在替换环节，要使用像<code>$1</code>、<code>$2</code>、<code>\$n</code>这样的语法。具体的做法请阅读下文的“在JavaScript的使用”。</p><p data-source-line="222">如果想要不记住匹配项，可以使用<code>(?:x)</code>，<code>x</code>代表表达式。</p><p data-source-line="224">想要了解更多类似<code>(?)</code>的语法，可以自行查找有关资料，本文不再展开讲述。</p><h1 id="转义" data-source-line="227"><a class="markdownIt-Anchor" href="#转义"></a>转义</h1><p data-source-line="229">如果你想查找特殊字符本身的话，需要在字符前添加反斜杠<code>\</code>。</p><p data-source-line="231">正则表达式特殊字符有：</p><p data-source-line="233">. \ / + * ? [ ^ ] $ ( ) { } = ! &lt; &gt; | : -</p><p data-source-line="235">如果不知道一个字符需不需要转义，即使加错了也没关系，不会影响结果，即使是普通的英文字母。</p><h1 id="在javascript的使用" data-source-line="237"><a class="markdownIt-Anchor" href="#在javascript的使用"></a>在JavaScript的使用</h1><h2 id="对于regexp对象" data-source-line="239"><a class="markdownIt-Anchor" href="#对于regexp对象"></a>对于RegExp对象</h2><table data-source-line="241"><thead><tr><th>方法</th><th>描述</th></tr></thead><tbody><tr><td>exec</td><td>一个在字符串中执行查找匹配的RegExp方法，它返回一个数组（未匹配到则返回null）。</td></tr><tr><td>test</td><td>一个在字符串中测试是否匹配的RegExp方法，它返回true或false。</td></tr></tbody></table><p data-source-line="246">以验证电子邮箱的例子为例：</p><pre data-source-line="248"><code class="hljs"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">validateEmail</span>(<span class="hljs-params">string</span>)</span>{ 
    <span class="hljs-keyword">var</span> re = <span class="hljs-regexp">/^[a-zA-Z0-9._-]+@[a-zA-Z0-9]+\.[a-zA-Z]+(\.[a-zA-Z]+)?/</span>; <span class="hljs-comment">//<span class="zh-hans">正则表达式需要包含在斜杠之间</span></span>
    <span class="hljs-keyword">return</span> re.test(string); 
}
<span class="hljs-built_in">console</span>.log(validateEmail(<span class="hljs-string">'admin@leililei.com'</span>));
</code></pre><p data-source-line="256">这个表达式输出<code>true</code>。</p><h2 id="对于字符串对象" data-source-line="258"><a class="markdownIt-Anchor" href="#对于字符串对象"></a>对于字符串对象</h2><table data-source-line="260"><thead><tr><th>方法</th><th>描述</th></tr></thead><tbody><tr><td>match</td><td>返回一个数组或者在未匹配到时返回null。</td></tr><tr><td>search</td><td>返回匹配到的位置索引，或者在失败时返回-1。</td></tr><tr><td>replace</td><td>一个在字符串中执行查找匹配的String方法，并且使用替换字符串替换掉匹配到的子字符串。</td></tr></tbody></table><p data-source-line="266">下面的脚本使用replace()方法来转换字符串中的单词。在匹配到的替换文本中，脚本使用替代的<code>$1</code>、<code>$2</code>表示第一个和第二个括号的子字符串匹配。</p><pre data-source-line="268"><code class="hljs"><span class="hljs-keyword">var</span> re = <span class="hljs-regexp">/(\w+)\s(\w+)/</span>;
<span class="hljs-keyword">var</span> str = <span class="hljs-string">"John Smith"</span>;
<span class="hljs-keyword">var</span> newstr = str.replace(re, <span class="hljs-string">"$2, $1"</span>);
<span class="hljs-built_in">console</span>.log(newstr);
</code></pre><p data-source-line="275">这个表达式输出“Smith, John”。</p><h2 id="标志" data-source-line="277"><a class="markdownIt-Anchor" href="#标志"></a>标志</h2><p data-source-line="279">你可能注意到有的正则表达式在末尾的斜杠之后还有其他字符，例如<code>/expression/i</code>中在<code>/</code>后的<code>i</code>。这是正则表达式的标志，可以以不同模式对文本进行匹配。</p><p data-source-line="281">不同的标志有不同的作用，以JavaScript为例。</p><table data-source-line="283"><thead><tr><th>标志</th><th>描述</th></tr></thead><tbody><tr><td>g</td><td>全局搜索。</td></tr><tr><td>i</td><td>不区分大小写搜索。</td></tr><tr><td>m</td><td>多行搜索。</td></tr><tr><td>y</td><td>执行“粘性”搜索,匹配从目标字符串的当前位置开始，可以使用y标志。</td></tr></tbody></table><h1 id="前后查找lookaround" data-source-line="290"><a class="markdownIt-Anchor" href="#前后查找lookaround"></a>前后查找（lookaround）</h1><h2 id="xy" data-source-line="292"><a class="markdownIt-Anchor" href="#xy"></a>x(?=y)</h2><p data-source-line="294">匹配'x'仅仅当'x'后面跟着'y'。这种叫做正向前查找，或称零宽度正预测先行断言（positive lookahead）。</p><p data-source-line="296">例如，<code>Jack(?=Sprat)</code>会匹配到'Jack'仅仅当它后面跟着'Sprat'。<code>Jack(?=Sprat|Frost)</code>匹配‘Jack’仅仅当它后面跟着'Sprat'或者是‘Frost’。但是‘Sprat’和‘Frost’都不是匹配结果的一部分。</p><h2 id="xy-2" data-source-line="298"><a class="markdownIt-Anchor" href="#xy-2"></a>x(?!y)</h2><p data-source-line="300">匹配'x'仅仅当'x'后面不跟着'y',这个叫做负向前查找，或称零宽度负预测先行断言（negative lookahead）。</p><p data-source-line="302">例如，<code>/\d+(?!\.)/</code>匹配一个数字仅仅当这个数字后面没有跟小数点的时候。在JavaScript中执行</p><pre data-source-line="304"><code class="hljs">/\d+(?!\.)/.exec(<span class="hljs-string">"3.141"</span>)
</code></pre><p data-source-line="308">匹配‘141’但是不是‘3.141’</p><h2 id="exp" data-source-line="310"><a class="markdownIt-Anchor" href="#exp"></a>(?&lt;=exp)</h2><p data-source-line="312">正向后查找，也称零宽度正回顾后发断言（positive lookbehind），有一些语言不支持本语法，如JavaScript。</p><h2 id="exp-2" data-source-line="314"><a class="markdownIt-Anchor" href="#exp-2"></a>(?&lt;!exp)</h2><p data-source-line="316">负向后查找，也称零宽度负回顾后发断言（negative lookbehind），JavaScript不支持该语法。</p><p data-source-line="318"><em>试试看（参考答案）</em></p><ol data-source-line="320"><li><code>[13579]</code>或<code>[^2468]</code></li><li><code>[1-9][0-9]</code></li><li><code>1[34579]\d{9}</code></li><li>匹配如666,6666,66666……的数字</li><li>第一位数字不能为0，应为<code>^[1-9][0-9]{4,10}$</code></li></ol><p data-source-line="326">本文的目的是为了能让初学者快速上手正则表达式，文章内容并不能完全覆盖正则表达式的所有内容。如果需要深入探索，可以查阅《正则表达式必知必会》。</p><h1 id="参考资料" data-source-line="328"><a class="markdownIt-Anchor" href="#参考资料"></a>参考资料</h1><ol data-source-line="330"><li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions" target="_blank">正则表达式 - JavaScript | MDN</a></li><li>《正则表达式必知必会》（Ben Forta著）</li></ol></div>
EOF;
//        \Illuminate\Support\Facades\DB::insert(<<<EOF
//INSERT INTO tree.courses (id, title, description, content, content_type, course_type, exp, depth, complete_conditions, event, created_at, updated_at, deleted_at) VALUES (1, '正则表达式', '本节详细介绍正则表达式的用法', '$md', 0, 0, 0, 0, null, null, null, null, null);
//EOF
//        );
        //4
        $course = new \App\Models\Course();
        $course->title = 'HTML表格';
        $course->description = '本节详细介绍HTML的表格的制作';
        $course->content = 'cf335c0ea17c4b7f837890fa5b5a2bfa';
        $course->course_type = \App\Models\Course::COURSE_TYPE_MAIN;
        $course->content_type = \App\Models\Course::CONTENT_TYPE_VIDEO;
        $course->exp = 30;
        $course->depth = 10;
        $course->save();



        //5
        $course = new \App\Models\Course();
        $course->title = '课程表制作';
        $course->description = '';
        $course->content = '充分利用已学习的HTML表格知识，完成一份个人课程表。';
        $course->course_type = \App\Models\Course::COURSE_TYPE_PRACTISE;
        $course->exp = 30;
        $course->depth = 15;
        $course->save();

        //6
        $course = new \App\Models\Course();
        $course->title = 'CSS样式基础';
        $course->description = '';
        $course->content = '这是一个CSS样式的介绍';
        $course->course_type = \App\Models\Course::COURSE_TYPE_MAIN;
        $course->exp = 30;
        $course->depth = 17;
        $course->save();
        \Illuminate\Support\Facades\DB::insert('INSERT INTO tree.skill_course (skill_id, course_id, next_course_id, complete_percentage, step) VALUES (1, 1, \'[2,3,4]\', 20.00, 1)');
        \Illuminate\Support\Facades\DB::insert('INSERT INTO tree.skill_course (skill_id, course_id, next_course_id, complete_percentage, step) VALUES (1, 4, \'[5,6]\', 60.00, 2)');
        \Illuminate\Support\Facades\DB::insert('INSERT INTO tree.skill_course (skill_id, course_id, next_course_id, complete_percentage, step) VALUES (1, 2, \'[]\', 20.00, 2)');
        \Illuminate\Support\Facades\DB::insert('INSERT INTO tree.skill_course (skill_id, course_id, next_course_id, complete_percentage, step) VALUES (1, 3, \'[]\', 20.00, 2)');

        \Illuminate\Support\Facades\DB::insert('INSERT INTO tree.skill_course (skill_id, course_id, next_course_id, complete_percentage, step) VALUES (1, 6, \'[]\', 80.00, 3)');
        \Illuminate\Support\Facades\DB::insert('INSERT INTO tree.skill_course (skill_id, course_id, next_course_id, complete_percentage, step) VALUES (1, 5, \'[]\', 60.00, 3)');
    }
}
